定期ミートアップ 第11回 yhara
できたこと
Maybe#mapの実装
ifの片方がNoneで片方がSomeのとき、if全体の型がObjectと推論されていた
Maybeになるように直した
次やること(1)
Hash#[]がMaybeを返すようにしたい
code:sk
# Get the value of specified key.
def [](key: K) -> Maybe<V>
var ret = None
@pairs.each do |pair: Pair<K, V>|
if pair.fst == key
ret = Some.new(pair.snd)
end
end
ret
end
問題点:retの型がNoneと推論されるので、Someを代入しようとしたところでエラーになる
暫定対処:Someを代入する箇所でretの型をMaybeに拡張する
理想的対処:型推論の一部として実装する
次やること(2)
いまの実装
code:rust
pub struct TermTy {
pub fullname: ClassFullname,
pub body: TyBody,
}
pub enum TyBody {
// Types corresponds to non-generic class
// eg. "Int", "String", "Object"
TyRaw,
// Types corresponds to (non-generic) metaclass
// eg. "Meta:Int", "Meta:String", "Meta:Object"
TyMeta {
base_fullname: String,
},
// This object belongs to the class Metaclass (i.e. this is a class object)
TyMetaclass,
// Types for generic metaclass eg. Meta:Pair<S, T>
// REFACTOR: remove this?
TyGenMeta {
base_name: String, // eg. "Pair"
typaram_names: Vec<String>, // eg. "S", "T" (For debug print) },
// Types for specialized class eg. Pair<Int, Bool>
TySpe {
base_name: String, // eg. "Pair"
type_args: Vec<TermTy>,
},
// Types for specialized metaclass eg. Meta:Pair<Int, Bool>
TySpeMeta {
base_name: String, // eg. "Pair"
type_args: Vec<TermTy>,
},
// Type parameter reference eg. T
TyParamRef {
kind: TyParamKind,
name: String,
idx: usize,
upper_bound: Box<TermTy>,
lower_bound: Box<TermTy>,
},
}
TyRawとTySpeは明らかにまとめられる
TyRawとTyMetaもまとめられる気がする
改修案?
code:rust
pub enum TermTy {
Class {
base_name: String
type_args: Vec<TermTy>
is_meta: bool
}
TyParamRef {
略
}
}
型推論を入れる前にやっておきたい
考えていること
crate分けたほうがいいのかなあ
core(型とか)
ast
parser
hir
code_gen
メモ
class Maybe<T>
class Some<T> : Maybe<T>
class None : Maybe<Never>